#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
Windows应用打包脚本
使用PyInstaller将PyQt5应用打包为Windows可执行文件
"""

import os
import sys
import shutil
import subprocess
from pathlib import Path

# 导入统一版本信息
from version import APP_NAME, APP_VERSION, BUILD_NUMBER

def build_windows_app():
    """使用PyInstaller打包Windows应用"""
    print("开始打包Windows应用...")
    
    # 使用统一版本信息
    app_name = APP_NAME
    version = f"{APP_VERSION}.{BUILD_NUMBER}"
    print(f"应用名称: {app_name}")
    print(f"应用版本: {version}")
    
    # 清理之前的构建文件
    dist_dir = Path("dist")
    build_dir = Path("build")
    spec_file = Path(f"{app_name}.spec")
    
    if dist_dir.exists():
        shutil.rmtree(dist_dir)
    if build_dir.exists():
        shutil.rmtree(build_dir)
    if spec_file.exists():
        os.remove(spec_file)
    
    # 创建图标目录
    icons_dir = Path("icons")
    if not icons_dir.exists():
        icons_dir.mkdir()
    
    # 构建命令
    cmd = [
        "pyinstaller",
        "--name", app_name,
        "--windowed",  # 无控制台窗口
        "--onefile",   # 单文件模式
        "--clean",     # 清理临时文件
        "--noconfirm", # 不询问确认
        "--add-data", f"icons{os.pathsep}icons",  # 添加资源文件
        "--version-file", f"version.py",  # 添加版本信息
        "app.py"       # 主程序文件
    ]
    
    # 如果存在图标文件，添加图标
    icon_path = Path("icons/app_icon.ico")
    if icon_path.exists():
        cmd.extend(["--icon", str(icon_path)])
    
    # 执行打包命令
    try:
        subprocess.run(cmd, check=True)
        print(f"应用打包成功！可执行文件位于: {dist_dir}")
        #  生成 .dmg 文件 将Applications 快捷方式 放入 dmg 根目录
        dmg_name = f"{app_name}.dmg"
        dmg_path = dist_dir / dmg_name
        #  创建 Applications 快捷方式
        # subprocess.run(["ln", "-s", "/Applications", dist_dir / "Applications"], check=True)
        subprocess.run(["hdiutil", "create", "-volname", app_name, "-srcfolder", dist_dir / f"{app_name}.app", "-ov", "-format", "UDZO", str(dmg_path)], check=True)
        print(f"应用打包成功！DMG文件位于: {dmg_path}")

    except subprocess.CalledProcessError as e:
        print(f"打包失败: {e}")
        return False
    
    return True

if __name__ == "__main__":
    build_windows_app()